package com.xz.example;

import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Assert;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

/**
 * @author zhangh     
 * @version V1.0.0
 * @projectName selfstudy-crawler
 * @title     JsoupDemo   
 * @package    com.xz.example  
 * @date   2019/10/10 15:20  
 * @explain Jsoup解析数据的例子
 */
public class JsoupDemo {


    // 测试Jsoup解析
    @Test
    public void testJsoupUrl() throws IOException {

        // 解析URL地址
        Document document = Jsoup.parse(new URL("http://www.itcast.cn/"), 1000);

        // 获取title内容
        Element title = document.getElementsByTag("title").first();

        //  练习下断言
        Assert.assertNotEquals("没有得到Title", null, title.text());

        System.out.println(title.text());
        //assert(title.text() == null);
    }


    // Jsoup可以直接输入字符串，并封装为Document对象
    @Test
    public void testJsoupString() throws IOException {

        // 读取文件获取
        String htmlStr = FileUtils.readFileToString(new File("E:\\ideaCode\\selfstudy-crawler\\crawler-day01\\src\\main\\resources\\static\\jsoupDemo.html"), "UTF-8");

        // 解析字符串
        Document document = Jsoup.parse(htmlStr);

        // 获取title内容
        Element title = document.getElementsByTag("title").first();
        String titleStr = title.text();

        // 断言
        Assert.assertNotNull("获取数据为空", titleStr);

        System.out.println(titleStr);
    }


    // 解析文件
    @Test
    public void testJsoupFile() throws IOException {

        // 解析文件
        Document document = Jsoup.parse(new File("E:\\ideaCode\\selfstudy-crawler\\crawler-day01\\src\\main\\resources\\static\\jsoupDemo.html"), "UTF-8");

        // 获取title内容
        Element title = document.getElementsByTag("title").first();
        String titleStr = title.text();

        // 断言
        Assert.assertNotNull("获取数据为空", titleStr);

        System.out.println(titleStr);
    }


    // 使用Dom方式遍历文档
    @Test
    public void testTraverseDemo() throws IOException {

        // 解析文件
        Document document = Jsoup.parse(new File("E:\\ideaCode\\selfstudy-crawler\\crawler-day01\\src\\main\\resources\\static\\jsoupDemo.html"), "UTF-8");

        // 根据id获取元素getElementById
        Element city_bj = document.getElementById("city_bj");
        System.out.println("根据id获取: " + city_bj);


        // 根据标签获取getElementsByTag
        Element title = document.getElementsByTag("title").first();
        System.out.println("根据标签获取: " + title);


        // 根据Class获取getElementsByClass
        Element clazzElement = document.getElementsByClass("s_name").first();
        System.out.println("根据Class获取: " + clazzElement);


        // 根据属性获取元素getElementsByAttribute
        Element element1 = document.getElementsByAttribute("abc").first();
        Element element2 = document.getElementsByAttributeValue("class", "s_name").first();
        System.out.println("根据属性获取元素1: " + element1);
        System.out.println("根据属性获取元素2: " + element2);
    }


    // 从元素中获取数据
    @Test
    public void getElementContent() throws IOException {

        // 解析文件
        Document document = Jsoup.parse(new File("E:\\ideaCode\\selfstudy-crawler\\crawler-day01\\src\\main\\resources\\static\\jsoupDemo.html"), "UTF-8");

        // 获取元素
        Element element = document.getElementById("test");

        // 获取元素中id
        String id = element.id();
        System.out.println("id: " + id);

        // 获取classname
        String className = element.className();
        System.out.println("className: " + className);

        // 获取属性值
        String attr = element.attr("id");
        System.out.println("attr: " + attr);

        // 获取所有属性
        String attributes = element.attributes().toString();
        System.out.println("attributes: " + attributes);

        // 从元素中获取内容
        String text = element.text();
        String html = element.html();
        System.out.println("text: " + text);
        System.out.println("html: " + html);
    }


    // Jsoup选择器(类似jq选择器)
    @Test
    public void testSelector() throws IOException {

        // 解析文件
        Document document = Jsoup.parse(new File("E:\\ideaCode\\selfstudy-crawler\\crawler-day01\\src\\main\\resources\\static\\jsoupDemo.html"), "UTF-8");

        // 标签选择
        Elements elements = document.select("span");
        for (Element element : elements) {
            System.out.println(element.text());
        }

        // #id选择器
        String city_bj = document.select("#city_bj").text();
        System.out.println("id选择: " + city_bj);

        // .class选择器
        String text = document.select(".s_name").text();
        System.out.println(".class: " + text);

        //[attribute]: 利用属性查找元素，比如：[abc]
        String text1 = document.select("[abc=123]").text();
        System.out.println("[attribute]: " + text1);

    }


    // Jsoup选择器(类似jq选择器),也可以组合使用
    @Test
    public void testSelector2() throws IOException {

        // 解析文件
        Document document = Jsoup.parse(new File("E:\\ideaCode\\selfstudy-crawler\\crawler-day01\\src\\main\\resources\\static\\jsoupDemo.html"), "UTF-8");

        //el#id: 元素+ID，比如： h3#city_bj
        String str = document.select("h3#city_bj").text();

        //el.class: 元素+class，比如： li.class_a
        str = document.select("li.class_a").text();

        //el[attr]: 元素+属性名，比如： span[abc]
        str = document.select("span[abc]").text();

        //任意组合，比如：span[abc].s_name
        str = document.select("span[abc].s_name").text();

        //ancestor child: 查找某个元素下子元素，比如：.city_con li 查找"city_con"下的所有li
        str = document.select(".city_con li").text();

        //parent > child: 查找某个父元素下的直接子元素，
        //比如：.city_con > ul > li 查找city_con第一级（直接子元素）的ul，再找所有ul下的第一级li
        str = document.select(".city_con > ul > li").text();

        //parent > * 查找某个父元素下所有直接子元素.city_con > *
        str = document.select(".city_con > *").text();
    }



}
